//
// Created by denglibin on 19-4-13.
//

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/*
fork函数：计算机程序设计中的分叉函数。返回值： 若成功调用一次则返回两个值，子进程返回0，父进程返回子进程id；否则，出错返回-1。
fork函数将运行着的程序分成2个（几乎）完全一样的进程，每个进程都启动一个从代码的同一位置开始执行的线程。
这两个进程中的线程继续执行，就像是两个用户同时启动了该应用程序的两个副本。在子进程创建之前的语句父进程和子进程都会各有一份。
*/
static int main_(int argc, char *argv[])
{
    pid_t pid;
    int i;
    printf("xxxxxxxx\n");//父进程才会执行该语句
    for( i= 0; i < 5; i++) //使用父进程创建5个子进程
    {
        pid = fork();
        if(pid == -1){
            perror("fork error!");
            exit(1);
        }else if(pid == 0){//子进程
            break;//禁止创建的子进程再创建子进程
            //printf("I'm %d child,pid = %u, ppid = %u\n",i+1,getpid(),getppid());//打印进程id和父进程id
        }else{
            //printf("I'm parent,pid = %u, ppid = %u\n",getpid(),getppid());
            //printf("创建了子进程%d\n", pid);
        }
    }

    if(i < 5){//是子进程（5个进程的i分别是0,1,2,3,4）
        sleep(i);
        printf("I'm %d child,pid = %u, ppid = %u\n",i,getpid(),getppid());//打印进程id
    }else{ //父进程（i=5）
        sleep(i);
        printf("I'm parent,pid = %u, ppid = %u\n",getpid(),getppid());
    }
    printf("yyyyyyyyyyyy\n");//子进程和父进程都会执行该语句

    return 0;
}
